/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package BaseDatos;

import Util.GestorConfiguracion;
import Util.GestorErrores;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author Javi
 */
final public class GestorBD {

    private static GestorBD _INSTANCIA = new GestorBD();
    private Connection _conexion = null;

    private GestorBD (){
    }

    public static GestorBD getInstancia (){
        return _INSTANCIA;
    }

    public boolean abrirConexion(){
        //Cargo los parametros necesarios del gestor de configuración
        String sUsuario = GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.USUARIO_BD);
        String sPassword = GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.PASSWORD_BD);
        String sHost = GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.HOST_BD);
        String sPuerto = GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.PUERTO_BD);
        String nombreBD = GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.BASE_DATOS);
        try {
            Class.forName("com.mysql.jdbc.Driver");
//            this.setConexion(DriverManager.getConnection("jdbc:mysql://localhost/proyecto", "root", ""));
            this.setConexion(DriverManager.getConnection("jdbc:mysql://" + sHost + "/" + nombreBD, 
                    sUsuario, sPassword));
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( "Error al establecer la conexión con la Base de Datos" );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    public boolean cerrarConexion(){
        try {
            //Comprueba que la conexión esté abierta previamente
            if (this.getConexion() != null)
                this.getConexion().close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( "Error al cerrar la conexión con la Base de Datos" );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * Prueba a establecer una conexión con los parámetros del Gestor de Configuración, pero sin
     * modificar la propiedad en la que se guarda la conexion actual
     */
    public boolean testConexion(){
        //Guardo aparte la conexión actual
        Connection conexionBackup = this._conexion;
        //Abro y cierro la conexión para probarla
        boolean bOK = this.abrirConexion() && this.cerrarConexion();
        //Restauro la conexión que teníamos
        this._conexion = conexionBackup;
        return bOK;
    }

    /**
     * @return the _conexion
     */
    public Connection getConexion() {
        return _conexion;
    }

    /**
     * @param conexion the _conexion to set
     */
    public void setConexion(Connection conexion) {
        this._conexion = conexion;
    }

    public void abrirTransaccion(){
        //Pongo autocommit a falso e inicio la transaccion
        try{
            this._conexion.setAutoCommit(false);
        }catch (SQLException e1) {
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }
    }

    public void cerrarTransaccion(boolean bCommit){
        try{
            if (bCommit)
                this._conexion.commit();
            else
                this._conexion.rollback();
            //Restauro el valor de autocommit a true
            this._conexion.setAutoCommit(true);
        }catch (SQLException e1) {
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }
    }

    /*
     * Obtiene el valor de la última clave autonumérica generada al insertar un registro.
     */
    public static int obtenerLastAutonumerico() {
        int iValor = 0;
        try {
            Statement st = getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT last_insert_id()");
            if (rs.next()) {
                iValor = rs.getInt(1);
            }
            rs.close();
            st.close();
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return iValor;
    }
}
